package com.etrans.web.gps.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
* @author 作者 :RenweiWu
* @CreateTime 创建时间：2018年7月30日 上午11:53:58
* 
*/



public class ExportWordUtils {

	
	private Configuration configuration = null;
	
	private Config conf;
	 
	public ExportWordUtils(Config conf) {
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
		this.conf=conf;
	}
 
	public void createDoc(Map<String, Object> dataMap, String fileName,String vm_name) throws UnsupportedEncodingException {
		// dataMap 要填入模本的数据文件
		// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet，classpath，数据库装载，
		// 这里我们的模板是放在com.havenliu.document.template包下面
		configuration.setClassForTemplateLoading(this.getClass(),conf.vm_path);
		Template t = null;
		try {
			// test.ftl为要装载的模板
			t = configuration.getTemplate(vm_name);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 输出文档路径及名称
		File outFile = new File(fileName);
		Writer out = null;
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(outFile);
			OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
			// 这个地方对流的编码不可或缺，使用main（）单独调用时，应该可以，但是如果是web请求导出时导出后word文档就会打不开，并且包XML文件错误。主要是编码格式不正确，无法解析。
			// out = new BufferedWriter(new OutputStreamWriter(new
			// FileOutputStream(outFile)));
			out = new BufferedWriter(oWriter);
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
 
		try {
			t.process(dataMap, out);
			out.close();
			fos.close();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @category 导出word方法
	 * @param response  HttpServletResponse 
	 * @param dataMap	数据集合
	 * @param fileName	导出的文件名称
	 * @param vm_name	word模板名称
	 * @throws UnsupportedEncodingException
	 */
	
	
	public void exportWord(HttpServletResponse response, Map<String, Object> dataMap, String fileName,String vm_name) throws UnsupportedEncodingException {
		// dataMap 要填入模本的数据文件
		// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet，classpath，数据库装载，
		// 这里我们的模板是放在com.havenliu.document.template包下面
		configuration.setClassForTemplateLoading(this.getClass(),conf.vm_path);
		Template t = null;
		try {
			// test.ftl为要装载的模板
			t = configuration.getTemplate(vm_name);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 输出文档路径及名称
		Writer out = null;
		OutputStream fos = null;
		try {
			fos = response.getOutputStream();
			response.setHeader("Content-Disposition", "attachment; filename=" +  java.net.URLEncoder.encode(fileName, "UTF-8")+ ".doc"); 
			response.setContentType("application/msexcel");// 定义输出类型
			response.setCharacterEncoding("utf-8");
			OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
			// 这个地方对流的编码不可或缺，使用main（）单独调用时，应该可以，但是如果是web请求导出时导出后word文档就会打不开，并且包XML文件错误。主要是编码格式不正确，无法解析。
			// out = new BufferedWriter(new OutputStreamWriter(new
			// FileOutputStream(outFile)));
			out = new BufferedWriter(oWriter);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
 
		try {
			t.process(dataMap, out);
			out.close();
			fos.close();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
